﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Configuration;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Web;
using System.Web.UI;
using APILocawebGatewayUI.Nucleo;

namespace APILocawebGatewayUI.VISA
{
    public sealed class Visa : Cartao
    {
        private Formulario form;

        #region Propriedades
        public override string ImgCartao
        {
            get
            {
                return "APILocawebGatewayUI.Recursos.ico_visa.gif";
            }
        }

        public override string Modulo
        {
            get
            {
                return "VISAVBV";
            }
        }

        [Category("Parâmetros obrigatórios")]
        [Description("Define o tipo de ambiente (teste ou producao).")]
        [DefaultValue("Teste")]
        [Browsable(false)]
        public override string Ambiente
        {
            get
            {
                object o = ViewState["VisaAmbiente"];
                return o == null ? APILocawebConfiguration.Instancia.Visa.Ambiente : o.ToString();
            }
            set { ViewState["VisaAmbiente"] = value; }
        }


        [Category("Parâmetros obrigatórios")]
        [Description("Dados do consumidor (Dados do comprador: nome do comprador, e-mail, telefone. Dados para entrega: nome, endereço, bairro, cidade, estado, cep) + Descrição do pedido.")]
        [DefaultValue("")]
        public string DadosDoConsumidor
        {
            get
            {
                object o = ViewState["DadosDoConsumidor"];
                return o == null ? "" : o.ToString();
            }
            set { ViewState["DadosDoConsumidor"] = value; }
        }

        [DefaultValue("1")]
        public override string Parcelas
        {
            get
            {
                return base.Parcelas;
            }
            set
            {
                base.Parcelas = value;
            }
        }

        [Category("Parâmetros obrigatórios")]
        [Description("Valor total da transação formatado.")]
        [DefaultValue("")]
        public string ValorFormatado
        {
            get
            {
                object o = ViewState["ValorFormatado"];
                return o == null ? "" : o.ToString();
            }
            set { ViewState["ValorFormatado"] = value; }
        }

        [Category("Parâmetros opcionais")]
        [Description("Tipo de parcelamento.")]
        [DefaultValue(typeof(TipoDeParcelamento), "CreditoaVista")]
        public TipoDeParcelamento TipoDeParcelamento
        {
            get
            {
                object o = ViewState["TipoDeParcelamento"];
                if (o == null)
                    return TipoDeParcelamento.CreditoaVista;
                return (TipoDeParcelamento)o;
            }
            set { ViewState["TipoDeParcelamento"] = value; }
        }

        [Category("Parâmetros opcionais")]
        [Description("Idioma utilizado no ambiente Amex")]
        [DefaultValue(typeof(IdiomaDoSite), "Portugues")]
        public IdiomaDoSite IdiomaDoSite
        {
            get
            {
                object o = ViewState["IdiomaDoSite"];
                if (o == null)
                    return IdiomaDoSite.Portugues;
                return (IdiomaDoSite)o;
            }
            set { ViewState["IdiomaDoSite"] = value; }
        }

        [Category("Parâmetros opcionais")]
        [Description("Possibilita a abertura da interface da operadora em um nova janela sem o bloqueio de antipopups.")]
        [DefaultValue(typeof(Antipopup), "habilitar")]
        public Antipopup Antipopup
        {
            get
            {
                object o = ViewState["Antipopup"];
                if (o == null)
                    return Antipopup.Habilitar;
                return (Antipopup)o;
            }
            set { ViewState["Antipopup"] = value; }
        }

        [Category("Parâmetros opcionais")]
        [Description("Tipo de autenticação da transação.")]
        [DefaultValue("")]
        public string TipoAutenticacao
        {
            get
            {
                object o = ViewState["TipoAutenticacao"];
                return o == null ? "" : o.ToString();
            }
            set { ViewState["TipoAutenticacao"] = value; }
        }

        [Category("Parâmetros opcionais")]
        public override string CampoLivre
        {
            get
            {
                return base.CampoLivre;
            }
            set
            {
                base.CampoLivre = value;
            }
        }

        [Category("Parâmetros opcionais")]
        [Description("Os 6 primeiros dígitos do cartão que será utilizado na transação.")]
        [DefaultValue("")]
        public string SeisPrimeirosDigitos
        {
            get
            {
                object o = ViewState["SeisPrimeirosDigitos"];
                return o == null ? "" : o.ToString();
            }
            set { ViewState["SeisPrimeirosDigitos"] = value; }
        }

        #endregion

        #region Funções para renderizar o formulário
        public override void RenderBeginTag(HtmlTextWriter writer)
        {

            writer.Write("<DIV align=\"center\" style=\"border:#e2e2e2 1px solid; width:" + VisaUtilidades.VisaVerificaImagem(this.ImageUrl) + "px;\">\n");
            base.RenderBeginTag(writer);

            form = new Formulario();
            form.AddControl(new InputInvisivel("identificacao", this.Identificacao));
            form.AddControl(new InputInvisivel("ambiente", this.Ambiente));
            form.AddControl(new InputInvisivel("modulo", this.Modulo));
            form.AddControl(new InputInvisivel("operacao", this.Operacao));
            form.AddControl(new InputInvisivel("tid", VisaUtilidades.GerarTid(APILocawebConfiguration.Instancia.Visa.Filiacao, this.Parcelas, this.TipoDeParcelamento)));
            form.AddControl(new InputInvisivel("orderid", this.NumeroDoPedido));
            form.AddControl(new InputInvisivel("order", this.DadosDoConsumidor));
            form.AddControl(new InputInvisivel("price", this.Valor));
            form.AddControl(new InputInvisivel("damount", this.ValorFormatado));

            form.AddControl(new InputInvisivel("visa_antipopup", ((int)this.Antipopup).ToString()));
            form.AddControl(new InputInvisivel("authenttype", this.TipoAutenticacao));
            form.AddControl(new InputInvisivel("free", this.CampoLivre));
            form.AddControl(new InputInvisivel("language", this.IdiomaDoSite == IdiomaDoSite.Portugues ? "pt" : this.IdiomaDoSite == IdiomaDoSite.Espanhol ? "es" : "en"));
            form.AddControl(new InputInvisivel("bin", this.SeisPrimeirosDigitos));
            writer.Write(form.Campos());
        }

        public override void RenderEndTag(HtmlTextWriter writer)
        {
            base.RenderEndTag(writer);
            writer.Write("\n<A style=\"line-height:25px; color:#06C; font-size:12px\" target=\"_blank\" href=\"http://www.visa.com.br/vbv/vbv_saibamais.asp\">Saiba mais</A>\n</DIV>");
        }
        #endregion
        

        /// <summary>
        /// Este método é utilizado quando os controles são criados em execução.
        /// </summary>
        /// <param name="pagina">Página que está instanciando e criando o controle</param>
        /// <param name="valor">Valor formatado de acordo cm o padrão visa. Pode ser obtido usando VisaUtilidades.FormatarValor()</param>
        /// <param name="valorFormatado">Valor formatado de acordo cm o padrão visa. Pode ser obtido usando VisaUtilidades.FormatarValorFormatado()</param>
        /// <param name="numeroDoPedido">Número do pedido para controle interno</param>
        /// <param name="dadosDoConsumidor">Informações do consumidor</param>
        public Visa(Page pagina, String valor, String valorFormatado, String numeroDoPedido, String dadosDoConsumidor)
            : base(pagina, valor, numeroDoPedido)
        {
            this.ValorFormatado = valorFormatado;
            this.DadosDoConsumidor = dadosDoConsumidor;
        }
        public Visa()
        {

        }
    }
}